﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data.OracleClient;
using System.Data;
using System.Configuration;

namespace Datos
{
    public class PagoAD
    {

        public static Pago UltimoPagoByIdPresupuesto(int ID)
            {
              

                string sql = @"SELECT id_pago, 
                                      id_tipo_pago, 
                                      id_presupuesto, 
                                      fecha, 
                                      monto, 
                                      numerosesion, 
                                      numboleta 
                                 FROM pago where id_presupuesto="+ID+@"
                                  AND numerosesion =(SELECT max(numerosesion)as num
                                                       FROM pago 
                                                      WHERE id_presupuesto="+ID+")";

                Pago pago = null;


                OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
                Oraclecon.Open();
                OracleCommand myCMD = new OracleCommand();
                myCMD.Connection = Oraclecon;
                myCMD.CommandText = sql;
                myCMD.CommandType = CommandType.Text;

                OracleDataReader reader = myCMD.ExecuteReader();


                if (reader.Read())
                {
                    pago = LoadPago(reader);
                }

                return pago;
            }

        private static Pago LoadPago(IDataReader reader)
        {
            Pago pago = new Pago();

            pago.ID_Pago = Convert.ToInt32(reader["id_pago"]);
            pago.tipopago = TipoPagoAD.GetTipoPagoById(Convert.ToInt32(reader["id_tipo_pago"]));
            if (reader["id_presupuesto"] != DBNull.Value)
            {
            pago.presupuesto = PresupuestoAD.GetPresupuestoById(Convert.ToInt32(reader["id_presupuesto"]));
            }
            else
            {
                pago.presupuesto = null;

            }
            pago.fecha = Convert.ToString(reader["fecha"]);
            pago.Monto = Convert.ToInt32(reader["monto"]);
            pago.NumeroSesion = Convert.ToInt32(reader["numerosesion"]);
            pago.NumBoleta = Convert.ToInt32(reader["numboleta"]);
          

            return pago;
        }

        public static bool NumeroBoleta(int num)
        {
            string sql = @"select	 *
	                            from   	 pago
	                            where    numboleta = " + num;

            int count = 0;



            OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
            try
            {
                Oraclecon.Open();
                OracleCommand myCMD = new OracleCommand();
                myCMD.Connection = Oraclecon;
                myCMD.CommandText = sql;
                myCMD.CommandType = CommandType.Text;




                count = Convert.ToInt32(myCMD.ExecuteScalar());
            }
            catch (Exception e)
            { }
            if (count == 0)
                return true;
            else
                return  false;
        }

        public static int NuevoPago(Pago pago)
        {
            OracleConnection oraConn = new OracleConnection();
            int k = 0;
            string connString = "Server=XE;Uid=juan;Pwd=lagartija";
            if (oraConn.State != ConnectionState.Open)
            {
                try
                {
                    oraConn.ConnectionString = connString;

                    oraConn.Open();

                    Console.WriteLine(oraConn.ConnectionString, "Successful Connection");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }
            }

            if (oraConn.State == ConnectionState.Open)
            {
                
                string sqlInsert = "insert into pago ";
                sqlInsert += "values (sequence_pago.nextval, :p_id_tipo_pago, :p_id_presupuesto, :p_fecha, :p_monto, :P_numerosesion, :p_numboleta)";
              
                OracleCommand cmdInsert = new OracleCommand();
                cmdInsert.CommandText = sqlInsert;
                cmdInsert.Connection = oraConn;

                OracleParameter pIdTipoPago = new OracleParameter();
                pIdTipoPago.DbType = DbType.Int32;
                pIdTipoPago.Value = Convert.ToInt32(pago.tipopago.ID_Tipo_Pago);
                pIdTipoPago.ParameterName = "p_id_tipo_pago";

                
                OracleParameter pIdPresupuesto = new OracleParameter();
                pIdPresupuesto.DbType = DbType.Int32;
                if (pago.presupuesto != null)
                {
                    pIdPresupuesto.Value = Convert.ToInt32(pago.presupuesto.ID_Presupuesto);
                }
                else
                {
                    pIdPresupuesto.Value = DBNull.Value;
                }

                pIdPresupuesto.ParameterName = "p_id_presupuesto";
                
                OracleParameter pFecha = new OracleParameter();
                pFecha.Value = pago.fecha;
                pFecha.ParameterName = "p_fecha";

                OracleParameter pMonto = new OracleParameter();
                pMonto.DbType = DbType.Int32;
                pMonto.Value = Convert.ToInt32(pago.Monto);
                pMonto.ParameterName = "p_monto";

                OracleParameter pNumeroSesion = new OracleParameter();
                pNumeroSesion.DbType = DbType.Int32;
                pNumeroSesion.Value = pago.NumeroSesion;
                pNumeroSesion.ParameterName = "p_numerosesion";

                OracleParameter pNumBoleta = new OracleParameter();
                pNumBoleta.DbType = DbType.Int32;
                pNumBoleta.Value = pago.NumBoleta;
                pNumBoleta.ParameterName = "p_numboleta";





                cmdInsert.Parameters.Add(pIdTipoPago);
                cmdInsert.Parameters.Add(pIdPresupuesto);
                cmdInsert.Parameters.Add(pFecha);
                cmdInsert.Parameters.Add(pMonto);
                cmdInsert.Parameters.Add(pNumeroSesion);
                cmdInsert.Parameters.Add(pNumBoleta);

                try
                {
                    k = cmdInsert.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message, "Exception Caught");
                }

                cmdInsert.Dispose();







            } return k;
        }

      /*  public static bool FinalizarSesionPago()
        {
            string sql = @"  " + num;

            int count = 0;



            OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
            try
            {
                Oraclecon.Open();
                OracleCommand myCMD = new OracleCommand();
                myCMD.Connection = Oraclecon;
                myCMD.CommandText = sql;
                myCMD.CommandType = CommandType.Text;




                count = Convert.ToInt32(myCMD.ExecuteScalar());
            }
            catch (Exception e)
            { }
            if (count == 0)
                return false;
            else
                return true;
        }*/

        public static int TotalRecaudado(string fecha)
        {

            string sql = @"SELECT SUM(MONTO)AS TOTAL_RECAUDADO 
                             FROM PAGO 
                            WHERE FECHA ='"+fecha+"'";

            int total = 0;


            OracleConnection Oraclecon = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija");
            Oraclecon.Open();
            OracleCommand myCMD = new OracleCommand();
            myCMD.Connection = Oraclecon;
            myCMD.CommandText = sql;
            myCMD.CommandType = CommandType.Text;

            OracleDataReader reader = myCMD.ExecuteReader();


            if (reader.Read())
            {
                if (reader["total_recaudado"] != DBNull.Value)
                {
                    total = Convert.ToInt32(reader["total_recaudado"]);
                }
                else
                {
                    total = 0;
                }


            }

            return total;
        }

        public static List<Pago> GetPagosByFecha(string fecha)
        {
            string sql = @"SELECT id_pago,
                                  id_tipo_pago,
                                  id_presupuesto,
                                  fecha,
                                  monto,
                                  numerosesion,
                                  numboleta
                             FROM pago
                            WHERE fecha = '" + fecha + "'";

            List<Pago> list = new List<Pago>();

            using (OracleConnection conn = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija"))
            {

                OracleCommand command = new OracleCommand(sql, conn);

                conn.Open();

                OracleDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    list.Add(LoadPago(reader));
                }

                return list;
            }
        }

        public static DataTable GetPagosByFechaDS(string fecha)
        {
            string sql = @"select pago.fecha, tratamiento.nombre_tratamiento as Tratamiento, pago.numboleta as Boleta, pago.monto
    from pago 
    LEFT OUTER JOIN presupuesto  ON pago.id_presupuesto = presupuesto.id_presupuesto
    LEFT OUTER JOIN tratamiento  ON presupuesto.id_tratamiento = tratamiento.id_tratamiento
                            WHERE pago.fecha = '" + fecha + "'";

            

           
            
            using (OracleConnection conn = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija"))
            {
                OracleDataAdapter adapter = new OracleDataAdapter(sql, conn);
                DataTable set = new DataTable("pago");

                adapter.Fill(set);
                
               
                return set;
            }
        }

    }

    public class TipoPagoAD
    {
        //trae tipo de pago por id
        public static TipoPago GetTipoPagoById(int id_tipopago)
        {
            string sql = @"SELECT id_tipo_pago, 
                                  nombretipopago
                             FROM tipo_pago
                            WHERE id_tipo_pago = " + id_tipopago;

            TipoPago tipopago = null;

            using (OracleConnection conn = new OracleConnection("Server=XE;Uid=juan;Pwd=lagartija"))
            {

                OracleCommand command = new OracleCommand(sql, conn);


                conn.Open();

                OracleDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    tipopago = LoadTipoPago(reader);
                }

                return tipopago;
            }

        }

        //carga tipos de pagos
        public static TipoPago LoadTipoPago(IDataReader reader)
        {
            TipoPago tipopago = new TipoPago();

            tipopago.ID_Tipo_Pago = Convert.ToInt32(reader["id_tipo_pago"]);
            tipopago.NombreTipoPago = Convert.ToString(reader["nombretipopago"]);

            return tipopago;
        }
    }
}
